package jers.util.daemon;

import java.security.Permission;

/**
 * Classe gerenciadora de securanca responsavel por decorar o gerenciador
 * padrao do sistema modificando a verificacao de saida System.exit().
 */
class ExitForbiddenSecurityManager extends SecurityManager {

	/** Gerenciador de seguranca decorado */
	private final SecurityManager decorated;
	
	/**
	 * Construtor padrao {@link ExitForbiddenSecurityManager}. 
	 */
	public ExitForbiddenSecurityManager(SecurityManager decorated) {
		this.decorated = decorated;
	}

	/**
	 * Gambiarra: Ao receber um chamado de System.exit(), 
	 * este finaliza a thread corrente ao inves de permitir 
	 * ou nao a finalizacao da JVM.
	 */
	@Override
	public void checkExit(int status) {
		Thread.currentThread().interrupt();
//		throw new ExitForbiddenException();
	}
	
	/**
	 * Executa a verificacao do gerenciador decorado.
	 */
	@Override
	public void checkPermission(Permission permission) {
		if (decorated != null) {
			decorated.checkPermission(permission);					
		}
	}
	
}
